using UnityEngine;

[CreateAssetMenu(fileName = "EnemyDetails_", menuName = "游戏SO文件/敌人/敌人详细信息文件")]
public class EnemyDetailsSO : ScriptableObject
{
    #region Header BASE ENEMY DETAILS
    [Space(10)]
    [Header("基础敌人详细信息")]
    #endregion

    #region Tooltip
    [Tooltip("敌人的名字")]
    #endregion
    public string enemyName;

    #region Tooltip
    [Tooltip("敌人的预制件")]
    #endregion
    public GameObject enemyPrefab;

    #region Tooltip
    [Tooltip("在敌人开始追逐之前与玩家的距离")]
    #endregion
    public float chaseDistance = 50f;
    
    #region Header ENEMY MATERIAL
    [Space(10)]
    [Header("敌人材质")]
    #endregion
    #region Tooltip
    [Tooltip("这是敌人的标准光照着色器材质（在敌人实体化后使用）")]
    #endregion
    public Material enemyStandardMaterial;
    
    #region Header ENEMY MATERIALIZE SETTINGS
    [Space(10)]
    [Header("敌人物化设置")]
    #endregion
    #region Tooltip
    [Tooltip("敌人出现所需的时间（以秒为单位）")]
    #endregion
    public float enemyMaterializeTime;
    #region Tooltip
    [Tooltip("当敌人实体化时要使用的着色器")]
    #endregion
    public Shader enemyMaterializeShader;
    [ColorUsage(true, true)]
    #region Tooltip
    [Tooltip("敌人出现时使用的颜色。 这是一种 HDR 颜色，因此可以设置强度以引起发光/泛光")]
    #endregion
    public Color enemyMaterializeColor;
    
    #region Header ENEMY WEAPON SETTINGS
    [Space(10)]
    [Header("敌人的武器设置")]
    #endregion
    #region Tooltip
    [Tooltip("敌人的武器 - 如果敌人没有武器，则没有")]
    #endregion
    public WeaponDetailsSO enemyWeapon;
    #region Tooltip
    [Tooltip("敌人连发射击之间的最小时间延迟间隔（以秒为单位）。 此值应大于 0。将在最小值和最大值之间选择一个随机值")]
    #endregion
    public float firingIntervalMin = 0.1f;
    #region Tooltip
    [Tooltip("敌人连发射击之间的最大时间延迟间隔（以秒为单位）。 将在最小值和最大值之间选择一个随机值")]
    #endregion
    public float firingIntervalMax = 1f;
    #region Tooltip
    [Tooltip("敌人在射击连发期间射击的最短射击持续时间。 此值应大于零。 将在最小值和最大值之间选择一个随机值.")]
    #endregion
    public float firingDurationMin = 1f;
    #region Tooltip
    [Tooltip("敌人在射击连发期间射击的最长射击持续时间。 将在最小值和最大值之间选择一个随机值.")]
    #endregion
    public float firingDurationMax = 2f;
    #region Tooltip
    [Tooltip("如果在敌人开火之前需要玩家的视线，请选择此选项。 如果未选择视线，只要玩家在“范围内”，无论障碍物如何，敌人都会开火")]
    #endregion
    public bool firingLineOfSightRequired;

    #region Header ENEMY HEALTH
    [Space(10)]
    [Header("敌人的生命值")]
    #endregion
    #region Tooltip
    [Tooltip("每个级别的敌人的生命值")]
    #endregion
    public EnemyHealthDetails[] enemyHealthDetailsArray;
    #region Tooltip
    [Tooltip("选择是否在被击中后立即有免疫期。 如果是这样，请在另一个字段中指定免疫时间（以秒为单位）")]
    #endregion
    public bool isImmuneAfterHit = false;
    #region Tooltip
    [Tooltip("被击中后的免疫时间（以秒为单位）")]
    #endregion
    public float hitImmunityTime;
    #region Tooltip
    [Tooltip("选择以显示敌人的生命条")]
    #endregion
    public bool isHealthBarDisplayed = false;

    #region Validation
#if UNITY_EDITOR
    // 验证输入的可编写脚本的对象详细信息
    private void OnValidate()
    {
        HelperUtilities.ValidateCheckEmptyString(this, nameof(enemyName), enemyName);
        HelperUtilities.ValidateCheckNullValue(this, nameof(enemyPrefab), enemyPrefab);
        HelperUtilities.ValidateCheckPositiveValue(this, nameof(chaseDistance), chaseDistance, false);
        HelperUtilities.ValidateCheckNullValue(this, nameof(enemyStandardMaterial), enemyStandardMaterial);
        HelperUtilities.ValidateCheckPositiveValue(this, nameof(enemyMaterializeTime), enemyMaterializeTime, true);
        HelperUtilities.ValidateCheckNullValue(this, nameof(enemyMaterializeShader), enemyMaterializeShader);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(firingIntervalMin), 
            firingIntervalMin, nameof(firingIntervalMax), 
            firingIntervalMax, false);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(firingDurationMin),
            firingDurationMin, nameof(firingDurationMax), 
            firingDurationMax, false);
        HelperUtilities.ValidateCheckEnumerableValues(this, nameof(enemyHealthDetailsArray), enemyHealthDetailsArray);
        if (isImmuneAfterHit)
        {
            HelperUtilities.ValidateCheckPositiveValue(this, nameof(hitImmunityTime), hitImmunityTime, false);
        }
    }

#endif
    #endregion

}